package us.proyecto.canarios.actions.concursos;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import org.ajax4jsf.exception.FileUploadException;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelectionIndex;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;
import org.richfaces.component.html.HtmlTree;
import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.model.TreeNode;

import us.proyecto.canarios.actions.admin.AutenticacionAction;
import us.proyecto.canarios.dao.ConcursoDAO;
import us.proyecto.canarios.dao.DiccionarioDAO;
import us.proyecto.canarios.dao.GruposDAO;
import us.proyecto.canarios.dao.PajarosDAO;
import us.proyecto.canarios.dao.UsuarioDAO;
import us.proyecto.canarios.domain.Asociacion;
import us.proyecto.canarios.domain.Concurso;
import us.proyecto.canarios.domain.Criador;
import us.proyecto.canarios.domain.Pajaro;
import us.proyecto.canarios.domain.Puntuacion;
import us.proyecto.canarios.domain.PuntuacionGrupo;
import us.proyecto.canarios.domain.Tipo;
import us.proyecto.canarios.domain.Usuario;

@Name("gestionGrupoAso")
@Scope(ScopeType.SESSION)
public class GestionGrupoAsoAction {

	@Logger
	Log log;

	private String nombre;
	private Asociacion asociacion;
	private Date fechaInicio;
	private Date fechaFin;

	@In(create = true)
	private UsuarioDAO usuarioDAO;

	private List<Tipo> listaTipos;

	@DataModel("listaPajaroAsoc")
	private List<Pajaro> listaPajaroAsoc;
	@DataModelSelectionIndex("listaPajaroAsoc")
	private int index;

	@In(create = true)
	private ConcursoDAO concursoDAO;

	@In(create = true)
	private DiccionarioDAO diccionariosDAO;

	@In(create = true)
	private PajarosDAO pajarosDAO;

	@In(create = true)
	private GruposDAO gruposDAO;

	private List<Criador> listaCriadores;

	private List<Pajaro> listaPajaros;

	private Puntuacion puntuacion;

	private PuntuacionGrupo puntuacionGrupo;

	@In
	private Usuario user;

	private Concurso concurso;

	private boolean annadido;

	@In(create = true)
	private AutenticacionAction autenticacion;

	// private Tipo tipo;

	private Pajaro pajaro;


	private Criador criador;

	private boolean selectCriador;


	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public void buscar() {
		String where = new String(" 1 = 1 ");
		where = where + " and c.asociacion.idAsociacion = "
				+ user.getAsociacion().getIdAsociacion();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date d = new Date();
		where = where + " and c.fechaInicio <= convert('" + sdf.format(d)
				+ " ', DATE) ";
		where = where + " and c.fechaFin >= convert('" + sdf.format(d)
				+ " ', DATE) ";
		// listaConcursosAsoc = concursoDAO.getListByWhere(where);

	}

	/*
	 * public int getIndexAsox() { return indexAsoc; }
	 *
	 * public void setIndexAsoc(int index) { this.indexAsoc = index; }
	 */
	public String traduce(String s) {
		String res = "";
		if (s.equals("true")) {
			res = "Si";
		} else {
			res = "No";
		}
		return res;

	}

	public void annadir() {
		if (pajaro.isEnGrupo()) {
			annadido = true;
			selectCriador = false;
			Criador c = pajaro.getCriador();
			Tipo t = pajaro.getTipo();
			//pajaro = new Pajaro();
			//pajaro.setCriador(c);
			//pajaro.setTipo(t);
			puntuacion = new Puntuacion();
			puntuacion.setConcurso(concurso);
			listaPajaros.remove(pajaro);
			puntuacion.setPajaro(pajaro);

			 Integer i = concursoDAO.obtieneNumJaula(concurso);
	            for(Pajaro p: listaPajaroAsoc){
	                if(p.getPuntuaciones()!=null){
	                    for(Puntuacion pun: p.getPuntuaciones()){
	                        if(pun.getConcurso().getIdConcurso() == concurso.getIdConcurso()){
	                            if(pun.getNumJaula().intValue() == i.intValue()){
	                                i = i +1;
	                            }
	                        }
	                    }
	                }
	            }
	        puntuacion.setNumJaula(i);

			if(pajaro.getPuntuaciones() == null){
                pajaro.setPuntuaciones(new HashSet<Puntuacion>());
            }
			//pajaro.getPuntuaciones().add(puntuacion);
			 pajaro = null;
			FacesMessages.instance().add("Se ha actualizado correctamente el pájaro");
		}else if (listaPajaroAsoc.size() < 4) {
            annadido = true;
            selectCriador = false;
            pajaro.setEnGrupo(true);
            Criador c = pajaro.getCriador();
            Tipo t = pajaro.getTipo();
            listaPajaroAsoc.add(pajaro);
            listaPajaros.remove(pajaro);
            // pajaro = new Pajaro();
            // pajaro.setTipo(t);
            // pajaro.setCriador(c);
            puntuacion.setPajaro(pajaro);
            pajaro.getPuntuaciones().add(puntuacion);
            puntuacion = new Puntuacion();
            //puntuacion.setPajaro(pajaro);
            puntuacion.setConcurso(concurso);
            Integer i = concursoDAO.obtieneNumJaula(concurso);
            for(Pajaro p: listaPajaroAsoc){
                if(p.getPuntuaciones()!=null){
                    for(Puntuacion pun: p.getPuntuaciones()){
                        if(pun.getConcurso().getIdConcurso() == concurso.getIdConcurso()){
                            if(pun.getNumJaula().intValue() == i.intValue()){
                                i = i +1;
                            }
                        }
                    }
                }
            }
            puntuacion.setNumJaula(i);

            if(pajaro.getPuntuaciones() == null){
                pajaro.setPuntuaciones(new HashSet<Puntuacion>());
            }
           // pajaro.getPuntuaciones().add(puntuacion);
            pajaro = null;
            FacesMessages.instance().add("Se ha añadido correctamente el pájaro");
        } else {
			FacesMessages.instance().add("Este grupo ya tiene 4 pájaros");
		}

		// buscar();

	}

	public void gestion() {
		pajaro = new Pajaro();
		puntuacion = new Puntuacion();
		puntuacion.setPajaro(pajaro);
		puntuacion.setConcurso(concurso);
		pajaro.setPuntuaciones(new HashSet<Puntuacion>());
		pajaro.getPuntuaciones().add(puntuacion);
		listaCriadores = usuarioDAO.getCriadores();
		// buscar();
		listaPajaroAsoc = new ArrayList<Pajaro>();

	}

	@Begin(join = true, flushMode=FlushModeType.MANUAL)
	public String gestion(Concurso con) {
		if (con.getIdConcurso() != 0) {
			String s = gruposDAO.getMaxPuntuacion(con);
			selectCriador = true;
			criador = null;
			listaPajaros = new ArrayList<Pajaro>();
			puntuacionGrupo = new PuntuacionGrupo();
			puntuacionGrupo.setPuntuaciones(new HashSet<Puntuacion>());
			puntuacionGrupo.setConcurso(con);
			puntuacionGrupo.setDescalificado(false);
			if (s != null && !s.equals("")) {
				puntuacionGrupo.setNumero(Integer.parseInt(s));
			}
			annadido = false;
			concurso = con;
			pajaro = new Pajaro();
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			puntuacion.setConcurso(concurso);
			puntuacion.setNumJaula(concursoDAO.obtieneNumJaula(concurso));

			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			listaCriadores = usuarioDAO.getCriadores();
			listaPajaroAsoc = new ArrayList<Pajaro>();
			return "true";
		}
		return "false";

	}

	/**
	 * @return the asociacion
	 */
	public Asociacion getAsociacion() {
		return asociacion;
	}

	/**
	 * @param asociacion
	 *            the asociacion to set
	 */
	public void setAsociacion(Asociacion asociacion) {
		this.asociacion = asociacion;
	}

	/**
	 * @return the fechaInicio
	 */
	public Date getFechaInicio() {
		return fechaInicio;
	}

	/**
	 * @param fechaInicio
	 *            the fechaInicio to set
	 */
	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	/**
	 * @return the fechaFin
	 */
	public Date getFechaFin() {
		return fechaFin;
	}

	/**
	 * @param fechaFin
	 *            the fechaFin to set
	 */
	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

	public List<Tipo> getListaTipos() {
		if (listaTipos == null) {
			listaTipos = diccionariosDAO.getListaTipos();
		}
		return listaTipos;
	}

	public void setListaTipos(List<Tipo> listaTipos) {
		this.listaTipos = listaTipos;
	}

	public Usuario getUser() {
		return user;
	}

	public void setUser(Usuario usuario) {
		this.user = usuario;
	}

	public Concurso getConcurso() {
		return concurso;
	}

	public void setConcurso(Concurso concurso) {
		this.concurso = concurso;
	}

	/*
	 * public Tipo getTipo() { return tipo; }
	 *
	 * public void setTipo(Tipo tipo) { this.tipo = tipo; }
	 */

	public void cambiarConcurso() {
		puntuacion.setConcurso(concurso);
		if (pajaro.getPuntuaciones() != null && concurso != null) {
			boolean enc = false;
			for (Puntuacion pun : pajaro.getPuntuaciones()) {
				if (pun.getConcurso().getIdConcurso() == concurso
						.getIdConcurso()) {
					puntuacion = pun;
					enc = true;
				}
			}
			if (!enc) {
				puntuacion = new Puntuacion();
				puntuacion.setPajaro(pajaro);
				puntuacion.setConcurso(concurso);
				pajaro.getPuntuaciones().add(puntuacion);
			}
		}
	}

	public void buscarPajaro() {
		Pajaro p = pajarosDAO.getPajaroByNumAnilla(pajaro.getNumAnilla());
		boolean seguir = true;
		boolean distinto = false;
		for (Pajaro paj : listaPajaroAsoc) {
			if (pajaro.getNumAnilla().equals(paj.getNumAnilla())) {
				FacesMessages.instance().add(
						"Este pajaro ya se ha añadido a este grupo");
				seguir = false;
			}
			if (listaPajaroAsoc.size() > 0 && p !=null ) {
				if (listaPajaroAsoc.get(0).getTipo().getIdTipo() != p.getTipo()
						.getIdTipo()) {
					FacesMessages.instance().add(
							"Este pajaro es de distinto tipo al resto");
					distinto = true;
				}
				if (listaPajaroAsoc.get(0).getCriador().getIdCriador() != p
						.getCriador().getIdCriador()) {
					FacesMessages.instance().add(
							"Este pajaro pertenece a otro criador");
					distinto = true;
				}

			}
		}
		if (!distinto) {
			Pajaro aux = pajaro;
			Puntuacion punt = puntuacion;
			pajaro = p;
			if (pajaro != null && pajaro.getPuntuaciones() != null
					&& concurso != null) {
				boolean enc = false;
				for (Puntuacion pun : pajaro.getPuntuaciones()) {
					if (pun.getConcurso().getIdConcurso() == concurso
							.getIdConcurso()
							&& pun.getPuntuacionGrupo() == null) {
						FacesMessages
								.instance()
								.add("Este pajaro ya se ha dado de alta en el concurso como individual");
						puntuacion = pun;
						enc = true;
						seguir = false;
					} else if (pun.getConcurso().getIdConcurso() == concurso
							.getIdConcurso()
							&& pun.getPuntuacionGrupo() != null) {
						FacesMessages
								.instance()
								.add("Este pajaro ya se ha dado de alta en el concurso como parte de otro grupo");
						puntuacion = pun;
						enc = true;
						seguir = false;
					}
				}
				if (!enc || !seguir) {
					Tipo tipo = pajaro.getTipo();
					Criador criador = pajaro.getCriador();
					pajaro = new Pajaro();
					if (annadido) {
						pajaro.setTipo(tipo);
						pajaro.setCriador(criador);
					}
					Integer i = concursoDAO.obtieneNumJaula(concurso);
		            for(Pajaro p1: listaPajaroAsoc){
		                if(p1.getPuntuaciones()!=null){
		                    for(Puntuacion pun: p1.getPuntuaciones()){
		                        if(pun.getConcurso().getIdConcurso() == concurso.getIdConcurso()){
		                            if(pun.getNumJaula() == i){
		                                i = i +1;
		                            }
		                        }
		                    }
		                }
		            }
					puntuacion = new Puntuacion();
					puntuacion.setNumJaula(i);
					puntuacion.setPajaro(pajaro);
					puntuacion.setConcurso(concurso);
					pajaro.getPuntuaciones().add(puntuacion);
				}

			} else {
				pajaro = aux;
				puntuacion = punt;
				// puntuacion.setPajaro(pajaro);
				// puntuacion.setConcurso(concurso);
				// pajaro.setPuntuaciones(new HashSet<Puntuacion>());
				// pajaro.getPuntuaciones().add(puntuacion);
			}
		}else{
			Pajaro p1 = listaPajaroAsoc.get(0);
			Criador c =p1.getCriador();
			Tipo t =p1.getTipo();
			pajaro = new Pajaro();
			pajaro.setTipo(t);
			pajaro.setCriador(c);
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			puntuacion.setConcurso(concurso);

			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
		}
	}

	public void guardar() {
		// pajaro.getPuntuaciones().add(puntuacion);
		if (listaPajaroAsoc.size() == 4) {
			puntuacionGrupo.setPuntuaciones(new HashSet<Puntuacion>());
			List<Puntuacion> listaPunt = new ArrayList<Puntuacion>();
			for (Pajaro p : listaPajaroAsoc) {
				if (p.getIdPajaro() == 0) {
					pajarosDAO.saveSinFlush(p);
				} else {
					pajarosDAO.updateSinFlush(p);
				}
				for (Puntuacion punt : p.getPuntuaciones()) {
					if (punt.getConcurso().getIdConcurso() == puntuacionGrupo
							.getConcurso().getIdConcurso()) {
						punt.setPuntuacionGrupo(puntuacionGrupo);
						listaPunt.add(punt);
					}
				}
			}

			puntuacionGrupo.getPuntuaciones().addAll(listaPunt);
			if (puntuacionGrupo.getIdPuntuacion() != 0) {
				gruposDAO.save(puntuacionGrupo);
			} else {
				gruposDAO.update(puntuacionGrupo);
			}
			FacesMessages
			.instance()
			.add("Grupo guardado correctamente");
		} else {
			FacesMessages
			.instance()
			.add("El grupo debe tener 4 pájaros");
		}
	}

	public void guardarAnadir() {
		// pajaro.getPuntuaciones().add(puntuacion);
		if (listaPajaroAsoc.size() == 4) {
			puntuacionGrupo.setPuntuaciones(new HashSet<Puntuacion>());
			List<Puntuacion> listaPunt = new ArrayList<Puntuacion>();
			for (Pajaro p : listaPajaroAsoc) {
				for (Puntuacion punt : p.getPuntuaciones()) {
					if (punt.getConcurso().getIdConcurso() == puntuacionGrupo
							.getConcurso().getIdConcurso()) {
						listaPunt.add(punt);
					}
				}
			}
			puntuacionGrupo.getPuntuaciones().removeAll(listaPunt);
			if (puntuacionGrupo.getIdPuntuacion() != 0) {
				gruposDAO.save(puntuacionGrupo);
			} else {
				gruposDAO.update(puntuacionGrupo);
			}
			gestion(concurso);
		} else {

		}

	}

	public List<Criador> getListaCriadores() {
		return listaCriadores;
	}

	public void setListaCriadores(List<Criador> listaCriadores) {
		this.listaCriadores = listaCriadores;
	}

	public Pajaro getPajaro() {
		return pajaro;
	}

	public void setPajaro(Pajaro pajaro) {
		this.pajaro = pajaro;
	}

	public Puntuacion getPuntuacion() {
		return puntuacion;
	}

	public void setPuntuacion(Puntuacion puntuacion) {
		this.puntuacion = puntuacion;
	}

	public String processSelection(NodeSelectedEvent event) {
		HtmlTree tree = (HtmlTree) event.getComponent();
		TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
		if (currentNode.isLeaf()) {
			Concurso c = (Concurso) currentNode.getData();
			concurso = c;
			pajaro = new Pajaro();
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			listaCriadores = usuarioDAO.getCriadores();
			buscar();
			return "true";
		} else {
			return "false";
		}
	}

	public List<Pajaro> getListaPajaroAsoc() {
		return listaPajaroAsoc;
	}

	public void setListaPajaroAsoc(List<Pajaro> listaPajaroAsoc) {
		this.listaPajaroAsoc = listaPajaroAsoc;
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	public boolean isAnnadido() {
		return annadido;
	}

	public void setAnnadido(boolean annadido) {
		this.annadido = annadido;
	}

	public void eliminar() {
		Pajaro p = listaPajaroAsoc.get(index);
		listaPajaroAsoc.remove(index);
		//Criador c = pajaro.getCriador();
		//Tipo t = pajaro.getTipo();
		Integer i = concursoDAO.obtieneNumJaula(concurso);
		for(Pajaro paj: listaPajaroAsoc){
			if(paj.getPuntuaciones()!=null){
				for(Puntuacion pun: paj.getPuntuaciones()){
					if(pun.getConcurso().getIdConcurso() == concurso.getIdConcurso()){
						if(pun.getNumJaula().intValue() == i.intValue()){
							i = i +1;
						}
					}
				}
			}
		}
		if (pajaro != null && p.getNumAnilla().equals(pajaro.getNumAnilla())) {
			//pajaro.setTipo(t);
			//pajaro.setCriador(c);
			//puntuacion = new Puntuacion();
			//puntuacion.setPajaro(pajaro);
			//pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			//pajaro.getPuntuaciones().add(puntuacion);
			pajaro = null;
			puntuacion.setNumJaula(i);
		}else{
			//puntuacion = new Puntuacion();
			puntuacion.setNumJaula(i);
		}
		FacesMessages.instance().add("Pajaro eliminado correctamente");

	}

	public void editar() {
		pajaro = listaPajaroAsoc.get(index);
		boolean enc = false;
		for (Puntuacion p : pajaro.getPuntuaciones()) {
			if (p.getConcurso().getIdConcurso() == concurso
					.getIdConcurso()) {
				puntuacion = p;
				puntuacion.getPajaro().setEnGrupo(true);
				listaPajaros.add(pajaro);
				enc = true;
			}
		}
		if (!enc) {
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			pajaro.getPuntuaciones().add(puntuacion);

		}
		annadido = true;
	}

	public PuntuacionGrupo getPuntuacionGrupo() {
		return puntuacionGrupo;
	}

	public void setPuntuacionGrupo(PuntuacionGrupo puntuacionGrupo) {
		this.puntuacionGrupo = puntuacionGrupo;
	}



	public void buscarPajaros(){
		if(criador!=null){
			listaPajaros = new ArrayList<Pajaro>();
			if(criador.getPajaros()!=null){
				//listaPajaros = pajarosDAO.getPajarosDisponibles(criador,concurso);
				listaPajaros.addAll(criador.getPajaros());
			}
		}
	}

	public Criador getCriador() {
		return criador;
	}

	public void setCriador(Criador criador) {
		this.criador = criador;
	}

	public List<Pajaro> getListaPajaros() {
		return listaPajaros;
	}

	public void setListaPajaros(List<Pajaro> listaPajaros) {
		this.listaPajaros = listaPajaros;
	}

	public boolean isSelectCriador() {
		return selectCriador;
	}

	public void setSelectCriador(boolean selectCriador) {
		this.selectCriador = selectCriador;
	}
	public void vacio(){}





}
